package com.itheima.reggie.service.impl;

import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.reggie.common.JwtUtil;
import com.itheima.reggie.common.ResultInfo;
import com.itheima.reggie.common.SmsTemplate;
import com.itheima.reggie.domain.User;
import com.itheima.reggie.mapper.UserMapper;
import com.itheima.reggie.service.UserService;
import io.jsonwebtoken.Jwts;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.Duration;
import java.util.HashMap;
import java.util.Random;

//用户
@Service
@Transactional
public class UserServiceImpl implements UserService {

    @Autowired//注入
    private SmsTemplate smsTemplate;
    @Autowired //注入
    private RedisTemplate redisTemplate;

    @Autowired //注入
    private UserMapper userMapper;
    //验证码
    @Override
    public void sendMsg(String phone) {
        String code = RandomUtil.randomNumbers(6); // 随机生成6位的验证码
        code="199856"; //todo  先暂时写死
        // 调用阿里云发短讯
        //smsTemplate.sendSms(phone,s); // 暂时先不用开启
        //将验证码存入redis（设置5分钟有效）
        redisTemplate.opsForValue().set("code:"+phone,code, Duration.ofSeconds(300)); // Duration.ofSeconds(300) 300秒
    }
    //登录
    @Override
    public ResultInfo login(String phone, String code) {
        String codeFromRedis = (String) redisTemplate.opsForValue().get("code:" + phone);
        // 1-2 比较
        if (!StrUtil.equals(code, codeFromRedis)) {
            // throw new ClassCastException("验证码不正确");
            return ResultInfo.error("验证码不正确");
        }
        // 然后再根据手机号查询数据库 看看是否有 没有就创建一个新的
        User user = userMapper.selectOne(new LambdaQueryWrapper<User>().eq(User::getPhone, phone));
        if (user==null){
            user = new User(); // 创建一个对象 设置手机号 在设置状态码
            user.setPhone(phone);
            user.setStatus(1);
            userMapper.insert(user);// 再添加这条数据
        } else {
            if (user.getStatus()!=1){
                return ResultInfo.error("账号被冻结");
            }
        }

        // jwt制作token
        HashMap<String, Object> map = new HashMap<>();
        map.put("id",user.getId());
        map.put("phone",user.getPhone());
        String token = JwtUtil.createToken(map);
        // 将uesr存入到redis中    保存一天
        redisTemplate.opsForValue().set("phone:"+user.getPhone(),user,Duration.ofDays(1));
        //清除redis中验证码
        redisTemplate.delete(phone);
        //返回token
        return ResultInfo.success(token);

    }
}
